#include <stdio.h>
#include <stdlib.h>
#include <queue>

using namespace std;

#define MaxVertexNum 10  /* 最大顶点数设为10 */

typedef struct{
    int vexnum;  /* 顶点数 */
    int arcnum;  /* 边数   */
    int arcs[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
}MGraph; /* 以邻接矩阵存储的图类型 */

void CreateGraph( MGraph &G );
/* 创建图邻接矩阵存储的 G；裁判实现，参见样例代码 */

void BFS( MGraph G, int V );
/* 广度优先遍历邻接矩阵存储的图 G 的一个连通子图， 出发点为 V */

bool visited[MaxVertexNum]; /* 顶点被访问标识数组 */

int main()
{
    freopen("6-5.in","r",stdin);
    MGraph G;
    int v;
    
    CreateGraph( G );
    printf("BFS for graph G:");
    
    /* 广度优先遍历图 G。
       使用辅助队列 Q 和 顶点被访问标识数组 visited[MaxVertexNum] */
    for (v = 0; v < G.vexnum; ++v)  visited[v] = false;
    
    for ( v = 0; v < G.vexnum; ++v ) /* 广度优先遍历图 G 的每一个连通子图*/
        if ( !visited[v] )
            BFS( G, v );
    
    return 0;
}

void CreateGraph( MGraph &G ){
    int i, j, k;
    
    scanf("%d%d", &G.vexnum, &G.arcnum ); /* 输入顶点数、边数 */
    
    for(i=0;i<G.vexnum;++i)//初始化邻接矩阵
        for(j = 0; j < G.vexnum; ++j)
            G.arcs[i][j] = G.arcs[j][i] = 0;
    // {adj,info}
    /* 构造邻接矩阵 */
    for(k = 0 ; k < G.arcnum; ++k)
    {   //构造邻接矩阵
        scanf("%d %d", &i, &j);  //输入一条边依附的顶点
        G.arcs[i][j] = G.arcs[j][i] = 1;
    }
}//CreateGraph

/* 你的代码将被嵌在这里 */
int queuuuu[10000011];
int head=0,tail=0;
void push(int a)
{
    queuuuu[tail++]=a;
}
int pop(void)
{
    return queuuuu[head++];
}
bool empty(void)
{
    return head==tail;
}
void BFS( MGraph G, int V )
{
    visited[V]=1;
    push(V);
    while(!empty())
    {
        V=pop();
        printf("%d",V);
        for(int i=0;i<G.vexnum;++i)
            if(G.arcs[V][i]&&!visited[i])
            {
                visited[i]=1;
                push(i);
            }
    }
}